package com.boe.common.util;

import java.io.File;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;

import kotlin.io.FilesKt;
import kotlin.io.OnErrorAction;
import lombok.*;

public class FileUtil {
    public static String joinPath(String... path) {
        if (path.length == 0) return "";

        var firstPath = path[0];
        var isRoot = firstPath.startsWith("/") || firstPath.startsWith("\\");

        var list = new ArrayList<String>();


        var splitList = Arrays.asList(path).stream()
                .map(it -> {
                            return Arrays.asList(it.split("[\\|/]"));
                        }
                ).collect(Collectors.toList());

        var spreadList = ListUtil.<String>unwindWithList(splitList).stream()
                .filter(it -> !it.isEmpty())
                .filter(it -> !it.equals("."))
                .collect(Collectors.toList());


        for (var i = 0; i < spreadList.size(); i++) {
            var it = spreadList.get(i);
            if (Objects.equals(it, "..")) {
                if (ListUtil.removeLast(list) == null) {
                    throw new RuntimeException("路径层级溢出");
                }
                continue;
            }

            list.add(it);
        }


        if (isRoot) {
            return File.separator + String.join(File.separator, list);
        }

        return String.join(File.separator, list);
    }

    public static void appendContent(String fileName, String content) {
        cn.hutool.core.io.FileUtil.appendString(content, new File(fileName), Charset.defaultCharset());
    }

    public static void clearContent(String fileName) {
        cn.hutool.core.io.FileUtil.writeBytes(new byte[0], new File(fileName));
    }

    public static void resetContent(String fileName, String content) {
        cn.hutool.core.io.FileUtil.writeString(content, new File(fileName), Charset.defaultCharset());
    }


    /**
     * 递归删除文件
     *
     * @param file
     * @return
     */
    public static Boolean delete(File file) {
        return FilesKt.deleteRecursively(file);
    }


    /**
     * 移动文件或文件夹， 如果目标存在，则删除。
     * @param sourceFileName
     * @param targetFileName
     * @return
     */
    public static boolean renameTo(String sourceFileName, String targetFileName) {
        var sourceFile = new File(sourceFileName);
        if (sourceFile.exists() == false) {
            return false;
        }

        var targetFile = new File(targetFileName);
        if (targetFile.exists()) {
            delete(targetFile);
        } else {
            targetFile.getParentFile().mkdirs();
        }

        return sourceFile.renameTo(targetFile);
    }


    /**
     * 复制文件或文件夹， 如果目标存在，则覆盖，如果目标文件夹存在，则合并。
     * @param sourceFileName
     * @param targetFileName
     * @return
     */
    public static boolean copy(String sourceFileName, String targetFileName){
        var sourceFile = new File(sourceFileName);
        if (sourceFile.exists() == false) {
            return false;
        }

        var targetFile = new File(targetFileName);
//        if (targetFile.exists() == false) {
//            if( sourceFile.isFile()) {
//                targetFile.getParentFile().mkdirs();
//            }
//            else{
//                targetFile.mkdirs();
//            }
//        }

        if( sourceFile.isFile()){
            FilesKt.copyTo(sourceFile,targetFile,true,10240);
            return true;
        }

        AtomicBoolean result = new AtomicBoolean(true);
        FilesKt.copyRecursively(sourceFile,targetFile, true, (file,e1)->{
            result.set(false);
            return OnErrorAction.SKIP;
        });

        return result.get();
    }
}
